/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.dao.util;
import java.io.*;
import java.sql.*;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletContext;
import javax.xml.parsers.*;
import org.w3c.dom.*;
/**
 *
 * @author LeThong
 */

public  class MySQLDataAccessHelper {
    /**
    * Thuộc tính đối tượng kết nối cơ sở dữ liệu
    */
   private Connection connection;

   private String driver;
   private String conString;
   private String user;
   private String password;
   /**
    * Phương thức cung cấp đối tượng kết nối đến cơ sở dữ liệu
    * @return đối tượng kết nối
    */
   
   public void ReadXMLfile()
   {
        try {

            
                File file = new File(this.getClass().getResource("../../../../../connectionConfig.xml").toURI());
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();
                Document doc = db.parse(file);
                doc.getDocumentElement().normalize();

                Element root = doc.getDocumentElement();
                NodeList driverNodeslst = root.getElementsByTagName("driver");
                Element fstNmElmnt = (Element) driverNodeslst.item(0);
                NodeList fstNm = fstNmElmnt.getChildNodes();
                driver=((Node) fstNm.item(0)).getNodeValue();
                
                NodeList conStringNodeslst = root.getElementsByTagName("connectionString");
                Element lstNmElmnt = (Element) conStringNodeslst.item(0);
                NodeList lstNm = lstNmElmnt.getChildNodes();
                conString=((Node) lstNm.item(0)).getNodeValue();
                
                NodeList userNodeslst = root.getElementsByTagName("username");
                Element userlstElmnt = (Element) userNodeslst.item(0);
                NodeList userlstNm = userlstElmnt.getChildNodes();
                user=((Node) userlstNm.item(0)).getNodeValue();
                
                NodeList passlstNmElmntLst = root.getElementsByTagName("password");
                Element passlstNmElmnt = (Element) passlstNmElmntLst.item(0);
                NodeList passlstNm = passlstNmElmnt.getChildNodes();
                password=((Node) passlstNm.item(0)).getNodeValue();
       } catch (Exception e) {
       }
   }
   
   public ArrayList<String> readTextFile(String filename) throws Exception
   {
        ArrayList<String> ds=new ArrayList<String>();
        BufferedReader br=null;
        String str=null;
        try {
            FileInputStream fIS=new FileInputStream("../Data/sql_Text_File/"+filename+".txt");
            br = new BufferedReader(new InputStreamReader(fIS,"UTF-8"));
            do{
                str=br.readLine();
                ds.add(str);
            }while(str!=null);
        } catch (Exception ex) {
            throw ex;
        } finally {
            try {
                br.close();
            } catch (IOException ex) {
                Logger.getLogger(MySQLDataAccessHelper.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return ds;
   }
   
   public ArrayList<String> parseString(String str)
    {
        ArrayList<String> ds=new ArrayList<String>(); 
        str=this.sTrim(str);
        String []s=str.split(" ");
        for(int i=0; i<s.length; i++)
            ds.add(s[0]);
        return ds;
    }
   
   public String readProperties(String skey)
   {
       String sRS="";
       Properties prop = new Properties();
    	try {
               //load a properties file
    		prop.load(new FileInputStream("../Data/storeProcedure.properties"));
 
               //get the property value and print it out
                sRS=prop.getProperty(skey);
    	} catch (IOException ex) {
        }
        return sRS;
   }
   
   public Connection getConnection() {
      return connection;
   }

   /**
    * Mở kết nối đến cơ sở dữ liệu
    */
    public void open()
    {
        try{
            ReadXMLfile();
            Class.forName(driver);
            Properties info=new Properties();
            info.setProperty("characterEncoding", "utf8");
            info.setProperty("user", user);
            info.setProperty("password", password);
            this.connection=DriverManager.getConnection(conString,info);
//            DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());
//            String connectionString = "jdbc:mysql://localhost:3306/ShoesStoreOnline";
//            Properties pros = new Properties();
//            pros.setProperty("characterEncoding", "utf8");
//            pros.setProperty("user", "root");
//            pros.setProperty("password", "lethong");
//            this.connection = DriverManager.getConnection(connectionString, pros);
        }
        catch(Exception ex)
        {
            System.out.println(ex);
        }
    }

    /**
    * Đóng kết nối cơ sở dữ liệu
    */
   public void close() {
      try {
         this.connection.close();
      } catch (SQLException ex) {
         Logger.getLogger(MySQLDataAccessHelper.class.getName()).log(Level.SEVERE, null, ex);
      }
   } 
    
    /**
    * Rút trích dữ liệu
    * @param sql câu truy vấn SELECT
    * @return ResultSet
    */
   public ResultSet executeQuery(String sql) {
      ResultSet rs = null;
      try {

         Statement sm = this.connection.createStatement();
         rs = sm.executeQuery(sql);
      } catch (SQLException ex) {
         System.out.println(ex.getMessage());
      }
      return rs;
   }

   /**
    * Rút trích dữ liệu
    * @param Tên Procedure
    * @return ResultSet
    */
   public ResultSet executeQueryProc(String procNamecall) {
      ResultSet rs = null;
      try {

         CallableStatement statement=this.connection.prepareCall(procNamecall);
         rs=statement.executeQuery();
      } catch (SQLException ex) {
         System.out.println(ex.getMessage());
      }
      return rs;
   }
   
   /**
    * Thêm, xóa, cập nhật dữ liệu
    * @param sql câu lệnh UPDATE, INSERT, DELETE
    * @return số lượng dòng cập nhật/thêm/xóa được , -1 : thất bại
    * @exception SQLException
    */
   public int executeUpdate(String sql) {
      int num = -1;
      try {
         Statement sm = this.connection.createStatement();
         num = sm.executeUpdate(sql);
      } catch (SQLException ex) {
        System.out.println(ex.getMessage());
      }
      return num;
   }
   
   /**
    * Thêm, xóa, cập nhật dữ liệu
    * @param sql câu lệnh UPDATE, INSERT, DELETE
    * @return số lượng dòng cập nhật/thêm/xóa được , -1 : thất bại
    * @exception SQLException
    */
   public int executeUpdateProc(String procNamecall) {
      int num = -1;
      try {
         CallableStatement statement=this.connection.prepareCall(procNamecall);
         num = statement.executeUpdate();
      } catch (SQLException ex) {
        System.out.println(ex.getMessage());
      }
      return num;
   }
   
   public String sTrim(String s){
        boolean flag=false;
        String sRs="";
        for(int i=0;i<s.length();i++){
            if(((s.codePointAt(i)>47)&&(s.codePointAt(i)<58)) || ((s.codePointAt(i)>64)&&(s.codePointAt(i)<91)) || ((s.codePointAt(i)>96)&&(s.codePointAt(i)<123))){
                flag=true;
                sRs+=s.charAt(i);
            }
            else if(flag==true){
                flag=false;
                sRs+=" ";
            }
        }
        return sRs;
    }
}
